From: Jan Beulich Date: Wed, 22 Jun 2016 09:59:39 +0000 (+0200) Subject: x86/vMSI-X: drop list lock X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~883 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=08844d189930da5b7846ed6078987fb2788d6173;p=xen.git x86/vMSI-X: drop list lock msixtbl_pt_{,un}register() already run with both the PCI devices lock and the domain event lock held, so there's no need for another lock. Just to be on the safe side, acquire the domain event lock in the cleanup function (albeit I don't think this is strictly necessary). Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- diff --git a/xen/arch/x86/hvm/vmsi.c b/xen/arch/x86/hvm/vmsi.c index 81e45c8b7a..7b0cfa9cac 100644 --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -468,8 +468,6 @@ int msixtbl_pt_register(struct domain *d, struct pirq *pirq, uint64_t gtable) pdev = msi_desc->dev; - spin_lock(&d->arch.hvm_domain.msixtbl_list_lock); - list_for_each_entry( entry, &d->arch.hvm_domain.msixtbl_list, list ) if ( pdev == entry->pdev ) goto found; @@ -480,7 +478,6 @@ int msixtbl_pt_register(struct domain *d, struct pirq *pirq, uint64_t gtable) found: atomic_inc(&entry->refcnt); - spin_unlock(&d->arch.hvm_domain.msixtbl_list_lock); r = 0; out: @@ -530,15 +527,10 @@ void msixtbl_pt_unregister(struct domain *d, struct pirq *pirq) pdev = msi_desc->dev; - spin_lock(&d->arch.hvm_domain.msixtbl_list_lock); - list_for_each_entry( entry, &d->arch.hvm_domain.msixtbl_list, list ) if ( pdev == entry->pdev ) goto found; - spin_unlock(&d->arch.hvm_domain.msixtbl_list_lock); - - out: spin_unlock_irq(&irq_desc->lock); return; @@ -547,7 +539,6 @@ found: if ( !atomic_dec_and_test(&entry->refcnt) ) del_msixtbl_entry(entry); - spin_unlock(&d->arch.hvm_domain.msixtbl_list_lock); spin_unlock_irq(&irq_desc->lock); } @@ -558,7 +549,6 @@ void msixtbl_init(struct domain *d) return; INIT_LIST_HEAD(&d->arch.hvm_domain.msixtbl_list); - spin_lock_init(&d->arch.hvm_domain.msixtbl_list_lock); register_mmio_handler(d, &msixtbl_mmio_ops); } @@ -566,21 +556,17 @@ void msixtbl_init(struct domain *d) void msixtbl_pt_cleanup(struct domain *d) { struct msixtbl_entry *entry, *temp; - unsigned long flags; if ( !d->arch.hvm_domain.msixtbl_list.next ) return; - /* msixtbl_list_lock must be acquired with irq_disabled for check_lock() */ - local_irq_save(flags); - spin_lock(&d->arch.hvm_domain.msixtbl_list_lock); + spin_lock(&d->event_lock); list_for_each_entry_safe( entry, temp, &d->arch.hvm_domain.msixtbl_list, list ) del_msixtbl_entry(entry); - spin_unlock(&d->arch.hvm_domain.msixtbl_list_lock); - local_irq_restore(flags); + spin_unlock(&d->event_lock); } void msix_write_completion(struct vcpu *v) diff --git a/xen/include/asm-x86/hvm/domain.h b/xen/include/asm-x86/hvm/domain.h index f500ff493b..f34d784c6c 100644 --- a/xen/include/asm-x86/hvm/domain.h +++ b/xen/include/asm-x86/hvm/domain.h @@ -124,7 +124,6 @@ struct hvm_domain { /* hypervisor intercepted msix table */ struct list_head msixtbl_list; - spinlock_t msixtbl_list_lock; struct viridian_domain viridian;